博客

Magento 二次开发系列十二 — 购物车部分功能重写,支持同个商品的不同model或part在一个购物车内

【php教程】Magento 二次开发系列十二 — 购物车部分功能重写,支持同个商品的不同model或part在一个购物车内

本节介绍如何更改购物车商品信息。

1.我们先重写购物车Model,新建app/code/local/Mage/Checkout/Model,app/code/local/Mage/Sales,具体重写的目录和文件请看下图
cart01
这些重写的文件都是从core对应的目录下复制过来,这么做的目的是遵循不修改核心代码的原则,接下来就要根据需要进行修改;

2.购物车涉及的表是sales_flat_quote以及sales_flat_quote开头的表,我们要修改的购物车中的商品,所以用到表sales_flat_quote_item,这里需要增加三个字段,compatible_model(商品model或part名称),buy_product(含有model或part商品名称),buy_url(购买的商品的url),sql脚本为:

alter table sales_flat_quote_item add column compatible_model varchar(255) default null;
alter table sales_flat_quote_item add column buy_product varchar(255) default null;
alter table sales_flat_quote_item add column buy_url varchar(255) default null;

3.首先要修改的Cart.php,addProduct()这个方法是添加购物车的商品,代码如下:

public function addProduct($productInfo, $requestInfo=null)
{
……省略原代码
$replaceName = isset($requestInfo['compatible_model'])?$requestInfo['compatible_model']:”;
$product->repalceName($replaceName);

……
}

4.通过查找添加逻辑,接下来修改Model/Quote.php中的addProductAdvanced()方法,代码如下:

public function addProductAdvanced(Mage_Catalog_Model_Product $product, $request = null, $processMode = null)
{
……原代码省略
foreach ($cartCandidates as $candidate) {
…..
$item->setData(‘compatible_model’,$request->getCompatibleModel());
$item->setData(‘buy_product’,$candidate->getName());
$urlPath = ‘/’.urlencode($request->getCompatibleModel()).’/’.$candidate->getUrlPath();
$item->setData(‘buy_url’,$urlPath);
……
}
……
}

5.修改Model/Quote/Item.php中的representProduct()方法,修改判断是否是新增商品的逻辑,代码如下:

public function representProduct($product)
{
……原代码省略
if (!$product || $itemProduct->getId() != $product->getId() || $itemProduct->getCompatibleModel() != $product->getCompatibleModel()) {
return false;
}

……
}

条件$itemProduct->getCompatibleModel() != $product->getCompatibleModel()就是我们新增的,这样我们就能根据自定义的model或part属性的值,作为新的商品看待。

5.购物车显示的时候,则需要修改Block,文件为app/code/local/Mage/Checkout/Block/Cart/Item/Renderer.php,我们只要修改获取商品名称的方法即可,代码如下:

public function getProductName()
{
if ($this->hasProductName()) {
return $this->getData(‘product_name’);
}
return $this->getItem()->getBuyProduct();//$this->getProduct()->getName();
}

现在添加商品之后,购物车显示的商品就会按我们想要的方式显示了。第一次接触的朋友可能会看的有点吃力,想要深入理解这里的逻辑,最好的方式进行实际操作下,如果能用xdebug调试下,印象就会很深刻了。

总结下本节,购物车数据是存在sales_flat_quote表中,其他以sales_flat_quote开头的都是这个表的关联子表,商品是存在sales_flat_quote_item中。Magento的表名称和类的目录结构可以联系起来看,就会发现,安装这个结构很容易找到对应的类方法。

注:此文为原创,如转载请注明出处。